package top.fsfsfs.main.logsys.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import top.fsfsfs.basic.base.R;
import top.fsfsfs.basic.base.entity.BaseEntity;
import top.fsfsfs.basic.mvcflex.controller.SuperController;
import top.fsfsfs.basic.mvcflex.request.PageParams;
import top.fsfsfs.basic.mvcflex.utils.ControllerUtil;
import top.fsfsfs.main.logsys.dto.FsSysLogsDto;
import top.fsfsfs.main.logsys.entity.FsSysLogs;
import top.fsfsfs.main.logsys.query.FsSysLogsQuery;
import top.fsfsfs.main.logsys.service.FsSysLogsService;
import top.fsfsfs.main.logsys.vo.FsSysLogsVo;

import java.io.File;
import java.util.List;

/**
 * 系统日志 控制层。
 *
 * @author hukunzhen
 * @since 2024-07-02
 */
@Slf4j
@RestController
@Validated
@Tag(name = "系统日志接口")
@RequestMapping("/main/logsys/fsSysLogs")
public class FsSysLogsController extends SuperController<FsSysLogsService, Long, FsSysLogs, FsSysLogsDto, FsSysLogsQuery, FsSysLogsVo> {
    @Autowired
    private FsSysLogsService fsSysLogsService;

    /**
     * 添加系统日志。
     *
     * @param fsSysLogsDto 系统日志
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @PostMapping
    @Operation(summary = "新增", description = "保存系统日志")
    public R<Long> save(@Validated @RequestBody @Parameter(description = "系统日志") FsSysLogsDto fsSysLogsDto) {
        return R.success(fsSysLogsService.saveDto(fsSysLogsDto).getId());
    }

    /**
     * 根据主键删除系统日志。
     *
     * @param ids 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping
    @Operation(summary = "删除", description = "根据主键删除系统日志")
    public R<Boolean> delete(@RequestBody List<Long> ids) {
        return R.success(fsSysLogsService.removeByIds(ids));
    }

    /**
     * 根据主键更新系统日志。
     *
     * @param dto 系统日志
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PutMapping
    @Operation(summary = "修改", description = "根据主键更新系统日志")
    public R<Long> update(@Validated(BaseEntity.Update.class) @RequestBody @Parameter(description = "系统日志主键") FsSysLogsDto dto) {
        return R.success(fsSysLogsService.updateDtoById(dto).getId());
    }

    /**
     * 根据系统日志主键获取详细信息。
     *
     * @param id 系统日志主键
     * @return 系统日志详情
     */
    @GetMapping("/{id}")
    @Operation(summary = "单体查询", description = "根据主键获取系统日志")
    public R<FsSysLogsVo> get(HttpServletResponse response, HttpServletRequest request, @PathVariable Long id) {
        FsSysLogs entity = fsSysLogsService.getById(id);
        return R.success(BeanUtil.toBean(entity, FsSysLogsVo.class));
    }

    /**
     * 分页查询系统日志。
     *
     * @param fsSysLogsQueryParams 分页对象
     * @return 分页对象
     */
    @PostMapping("/page")
    @Operation(summary = "分页列表查询", description = "分页查询系统日志")
    public R<Page<FsSysLogsVo>> page(@RequestBody @Validated PageParams<FsSysLogsQuery> fsSysLogsQueryParams) {
        Page<FsSysLogsVo> page = Page.of(fsSysLogsQueryParams.getCurrent(), fsSysLogsQueryParams.getSize());
        FsSysLogs entity = BeanUtil.toBean(fsSysLogsQueryParams.getModel(), FsSysLogs.class);
        QueryWrapper wrapper = QueryWrapper.create(fsSysLogsQueryParams.getModel(), ControllerUtil.buildOperators(entity.getClass()));

        ControllerUtil.buildOrder(wrapper, fsSysLogsQueryParams, entity.getClass());
        fsSysLogsService.pageAs(page, wrapper, FsSysLogsVo.class);
        return R.success(page);
        // Page<FsSysLogs> page = Page.of(params.getCurrent(), params.getSize());
        // fsSysLogsService.page(page, wrapper);
        // Page<FsSysLogsVo> voPage = top.fsfsfs.basic.mybatisflex.utils.BeanPageUtil.toBeanPage(page, FsSysLogsVo.class);
        // return R.success(voPage);
    }

    @PostMapping("/handleFileUpload")
    public R<String> handleFileUpload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return R.success( "文件为空，请选择一个文件上传。" );
        }
        //String strJson = JSONUtil.toJsonStr(file) ;
        //System.out.println(strJson);
        try {
            // 获取原始文件名
            String fileName = file.getOriginalFilename();

            // 获取文件的字节
            byte[] bytes = file.getBytes();

            // 这里可以添加保存文件的代码，例如将文件保存到磁盘或数据库
            file.transferTo(new File("E:/ossfile/"+fileName));

            return R.success("文件上传成功：" + fileName);// file );//"文件上传成功：" + fileName;
        } catch (Exception e) {
            return R.success(  "文件上传失败：" + e.getMessage() );
        }
    }
}
